package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

// 通知类型
@Slf4j
@Component
// @Aspect // 声明为切面类 = 切入点 + 通知
public class AdviceType {
    // 1.使用注解抽取切入点表达式
    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void pt() {}

    @Before("pt()")
    public void bofore() {
        log.info("@Before 前置通知");
    }

    @AfterReturning("pt()")
    public void afterReturning() {
        log.info("@AfterReturning 后置通知");
    }

    @AfterThrowing("pt()")
    public void afterThrowing() {
        log.info("@AfterThrowing 异常通知");
    }

    @After("pt()")
    public void After() {
        log.info("@After 最终通知");
    }

    @Around("pt()")
    public Object Around(ProceedingJoinPoint pjp) {
        // 自己实现代码
        Object ret = null;
        try {
            log.info("自己实现: 前置通知");
            ret = pjp.proceed();// 调用目标方法
            log.info("自己实现: 后置通知");
        } catch (Throwable e) {
            log.info("自己实现: 异常通知");
        } finally {
            log.info("自己实现: 最终通知");
        }
        return ret;
    }
}
